package E_2024;

import java.util.Arrays;
import java.util.Stack;

/*
题目描述:
    公司老板做了一笔大生意，想要给每位员工分配一些奖金，想通过游戏的方式来决定每个人分多少钱。
    按照员工的工号顺序，每个人随机抽取一个数字。按照工号的顺序往后排列，遇到第一个数字比自己数字大的，
    那么，前面的员工就可以获得“距离*数字差值”的奖金。如果遇不到比自己数字大的，就给自己分配随机数数量的奖金。
    例如，按照工号顺序的随机数字是: 2,10.3。那么第2个员工的数字10比第1个员工的数字2大，
    所以，第1个员工可以获得1*(10-2) =8。第2个员工后面没有比他数字更大的员工，
    所以，他获得他分配的随机数数量的奖金，就是10。第3个员工是最后一个员工，后面也没有比他更大数字的员工，所以他得到的奖金是3。
    请帮老板计算一下每位员工最终分到的奖金都是多少钱

输入描述:
    第一行n表示员工数量 (包含最后一个老板)
    第二是每位员工分配的随机数字
    例如
    3
    2 10 3
输出描述:
    最终每位员工分到的奖金数量
    例如
    8 10 3
    补充说明:
    随机数字不重复，员工数量(包含老板)范围1~10000
    9 4 1 5 6 20 7 12 10
 */
public class E_100_35 {
    public static void main(String[] args) {
        System.out.println(Arrays.toString(ans(new int[]{2, 10, 3})));
        System.out.println(Arrays.toString(ans(new int[]{9,4,1,5,6,20,7,12,10})));
    }
    // 通过栈来计算，栈顶为当前最小值，当遇到新值时循环判断栈顶的值时候小与新值，
    // 当小与时说明栈顶的数据已经遇到一个可以退出栈的数据，此时弹出栈，并在结果集的对应下标中计算奖金
    public static int[] ans(int[] arr){
        int[] ans = new int[arr.length];
        Stack<Integer[]> stack = new Stack<>();
        for (int i = 0; i < arr.length; i++) {
            int temp = arr[i];
            Integer[] peek;
            // 循环判断栈顶的值与当前值的大小比较，当前值较大时弹出栈顶
            while(!stack.isEmpty() && (peek = stack.peek())[1] < temp){
                ans[peek[0]] = (i - peek[0]) * peek[1];
                stack.pop();
            }
            stack.push(new Integer[]{i,temp});
        }
        for (Integer[] temp : stack) {
            ans[temp[0]] = temp[1];
        }
        return ans;
    }
}
